Firestore Security Rules
Overview  |  Firebase
boolean, bytes, duration, float, integer, latlng,
list
concat, hasAll, hasAny, hasOnly, join(separator), removeAll, size, toSet(setは、diff, intersection, unionがある)
string
lower, matches(re), replace(re, sub), split(re), trim, toUtf8(byte encodingする, urlとこかに使える?)
timestamp, duration,
debug
firebase emulatorsで、firestore-debug.log に出力してくれる。本番環境で欲しいが...
【便利】Cloud Firestoreのrulesで値を確認できるdebug()関数 - Qiita
firestore
重要
pathを引数に取る
get, getAfter, exists, exsitesAfter
after???
Cloud FirestoreのセキュリティルールでgetAfter関数が使えるようになったので使ってみた - Qiita
request
.auth(uid, token)
tokenは、
email, email_verified, phone_number, name, sub(auth.uidと同じ?), firebase.identities(providerとの利用方法の違い?), firebase.sign_in_provider
method(get, list, create, update, delete)
path, query(limit, offset, orderBy)
resource
The new resource value, present on write requests only.
書き込み時の値??? https://firebase.google.com/docs/reference/rules/rules.firestore.Resource
The firestore document being read or written.
よくわからない.
使い方
collection groupの場合,
firebase - Is {path=**} necessary for collection group queries? - Stack Overflow
拒否されて??となっていていたのは、
/grps/1/users/44/products/....という構造で、
queryが firebase.firestore().collectionGroup("products")......
で、securirty rulesで、 match /users/{path=**}/products/{prouductId} {allow read: if... }
としてして、rejectされていた。
queryがproductsなら、security rulesも、/{path=**}/products/{productsId}にしないと行けない。
では、で、whereの部分、field でガードを掛けるようにするのが正解?のよう。
Secure collection group queries based on a field
【改訂版】 Firebase Cloud Firestore rules tips
ここを読むのが一番速い。
Firebase - Visual Studio Marketplace
Firebase セキュリティ ルール スタートガイド  |  Firebase
Cloud Firestore と Storage では Common Expression Language(CEL)のスーパーセットを利用し、match ステートメントと allow ステートメントに依存して、定義したパスのアクセスへの条件を設定します。
セキュリティ ルール言語  |  Firebase
code:securityRule.cel
service <<name>> {
// Match the resource path.
match <<path>> {
// Allow the request if the following conditions are true.
allow <<methods>> : if <<condition>>
}
}
<<service>>名を指定して、<<path>>を指定して、許可するmethodsを指定(allowのみでdenyはない?), conditionがあれば、指定。
例:
serviceは、 cloud.firestore で固定
pathは、部分一致(前方一致かな)と完全一致がとれる。
完全一致の場合、ブロック内のルールが評価されます。部分一致の場合、ネストされた match ルールがテストされ
{variable}で変数としておいて、配下の{}で、その変数について再度match式(+ if)?が適用できる
{variable=**}とすると、/ で切らずに末尾のpathまで変数に取り、その配下でallow, match式(+if)を適用する。
function リテラルも使える。複雑なルールはfunctionでまとめる。
条件(ifのこと?)
presetの変数がある、request, resosurce. webのリクエストを解析するのと同じイメージ。
request.auth, request.method, request.params,
resourceは、サービスの現在の値と書いてあるが、、cloud.firestoreなら....
Interface: Resource  |  Firebase
firestoreのdocumentの値とかかな。であれば、細かい制御は可能かな。
Firebase Security Rules Regular Expressions  |  Firebase
ここに正規表現の例がある。
とりあえず, service がcloud.firestoreで、特定path + domain限定
code:securityRule_domain.cel
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth.token.email.matches('.*@mydomain.com') == true
}
}
}
Interface: String  |  Firebase
realtime databaseのreferenceと間違えていて、時間を消耗したので、それに注意。 urlにdatabaseが入ると(現時点では) realtime,
firestoreはurl上でpathを切ってない?